package Crypto

import "math/big"

//base58实现
/*
1.确定编码表
2.将传入字符串转成字节数组
3.将字节数组转成big.int
4.对基数58求余
*/
var base58Alphabet = []byte(
	"123456789" +
		"abcdefghijkmnopqrstuvwxyz" +
		"ABCDEFGHJKLMNPQRSTUVWXYZ")


//编码函数
func Base58Encode(input []byte)[]byte{

	var result []byte
	//big.Int
	//byte字节数组 转换为big.Int
	x  := big.NewInt(0).SetBytes(input)
	//求余的基本长度
	base := big.NewInt(int64(len(base58Alphabet)))
	//求余数和商
	//判断条件 除掉最终的结果是否为0
	zero := big.NewInt(0)
	//设置余数 代表base5 基数表的索引位置
	mod := &big.Int{}

	for x.Cmp(zero)  != 0{
		x.DivMod(x,base,mod)
		//倒序结果
		result = append(result,base58Alphabet[mod.Int64()])
	}

	Reverse(result)
	//添加一个前缀1  代表是前缀地址
	result = append([]byte{base58Alphabet[0]},result...)

	return result
}

func Reverse (data []byte){
	for i,j := 0,len(data)-1;   i<j;   i,j=i+1,j-1{
		data[i],data[j]=data[j] ,data[i]
	}
}

//解码函数
func Base58Decode(input []byte)[]byte{
	result := big.NewInt(0)

	firtyEight := big.NewInt(58)
	//去掉前缀
	data :=   input[1:]
	for _ ,b :=  range data{
		//查找base58表
		codeValue := Getbase58CodeValue(b)
		//余数乘58
		result.Mul(result,firtyEight)
		//乘积结果加上索引值
		result.Add(result,codeValue)
	}

	//bigInt转换为字节数组
	decoded := result.Bytes()

	return decoded

}

func Getbase58CodeValue(value byte) *big.Int {
	for index,v := range base58Alphabet{
		if v == value{
			return big.NewInt(int64(index))
		}
	}
	return big.NewInt(0)
}
//
